package com.orangelife.service.propFeeDirectBill.impl;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;

import com.alipay.api.domain.Data;
import com.github.pagehelper.PageHelper;
import com.orangelife.common.MybaitsGenericDaoSubLogic;
import com.orangelife.exception.AppBizException;
import com.orangelife.service.PropFeeType.IPropFeeTypeService;
import com.orangelife.service.PropFeeType.model.PropFeeTypeDto;
import com.orangelife.service.cerHouseholder.ICerHouseholderService;
import com.orangelife.service.cerHouseholder.model.CerHouseholderDto;
import com.orangelife.service.feeDetail.IFeeDetailService;
import com.orangelife.service.feeDetail.modal.PropFeeDetailDto;
import com.orangelife.service.propFeeAccount.IPropFeeAccountService;
import com.orangelife.service.propFeeAccount.model.PropFeeAccountDto;
import com.orangelife.service.propFeeAccountFrozen.IPropFeeAccountFrozenService;
import com.orangelife.service.propFeeAccountFrozen.model.PropFeeAccountFrozenDto;
import com.orangelife.service.propFeeAmountLog.IPropFeeAmountLogService;
import com.orangelife.service.propFeeAmountLog.model.PropFeeAmountLogDto;
import com.orangelife.service.propFeeComm.IPropFeeCommService;
import com.orangelife.service.propFeeComm.model.PayBillInfo;
import com.orangelife.service.propFeeComputeRule.IPropFeeComputeRuleService;
import com.orangelife.service.propFeeDirectBill.IPropFeeDirectBillService;
import com.orangelife.service.propFeeDirectBill.model.PropFeeDirectBillDto;
import com.orangelife.service.propFeeDirectBillLink.IPropFeeDirectBillLinkService;
import com.orangelife.service.propFeeDirectBillLink.model.PropFeeDirectBillLinkDto;
import com.orangelife.service.propFeeDirectOffsetInfo.IPropFeeDirectOffsetInfoService;
import com.orangelife.service.propFeeDirectOffsetInfo.model.PropFeeDirectOffsetInfoDto;
import com.orangelife.service.propFeePreBill.model.PropFeePreBillDto;
import com.orangelife.service.propFeeTransfer.IPropFeeTransferService;
import com.orangelife.service.propFeeTransfer.model.PropFeeTransferDto;
import com.orangelife.setting.constant.CodeConst;
import com.orangelife.setting.constant.InfoConst;
import com.orangelife.setting.constant.TypeConst;
import com.orangelife.utils.DateUtil;
import com.orangelife.utils.HttpSvcUtils;
import com.orangelife.utils.IdUtil;
import com.orangelife.utils.PropertyUtils;
import com.orangelife.utils.StringUtils;
import com.orangelife.utils.UUIDGenerator;
import com.orangelife.utils.UrlPath;

/*****************************************************************
 * Copyright(C) ORANGELIFE Corporation CodeConst.BIS_CODE_68001015. All Rights
 * Reserved.
 *****************************************************************/
/*
 * ============================================================== 功能名
 * PropFeeDirectBill类的 service层的增删改查
 * 
 * @author @author zhr
 * 
 * @version 1.1.0
 * 
 * @date 2016-11-24 14:14:12
 * ==============================================================
 */
@Service("propFeeDirectBillService")
public class PropFeeDirectBillServiceImpl extends MybaitsGenericDaoSubLogic
		implements IPropFeeDirectBillService {
	private static Logger logger = Logger
			.getLogger(PropFeeDirectBillServiceImpl.class);

	public static Logger getLogger() {
		return logger;
	}

	public static void setLogger(Logger logger) {
		PropFeeDirectBillServiceImpl.logger = logger;
	}

	@Resource(name = "propFeeDirectOffsetInfoService")
	private IPropFeeDirectOffsetInfoService propFeeDirectOffsetInfoService;
	@Resource(name = "propFeeTransferService")
	private IPropFeeTransferService propFeeTransferService;
	@Resource(name = "propFeeDirectBillLinkService")
	private IPropFeeDirectBillLinkService propFeeDirectBillLinkService;
	@Resource(name = "propFeeAccountFrozenService")
	private IPropFeeAccountFrozenService propFeeAccountFrozenService;
	@Resource(name = "cerHouseholderService")
	private ICerHouseholderService cerHouseholderService;
	@Resource(name = "propFeeAccountService")
	private IPropFeeAccountService propFeeAccountService;
	@Resource(name = "propFeeTypeService")
	private IPropFeeTypeService propFeeTypeService;
	@Resource(name = "feeDetailService")
	private IFeeDetailService feeDetailService;
	@Resource(name = "propFeeComputeRuleService")
	private IPropFeeComputeRuleService propFeeComputeRuleService;

	@Resource(name = "propFeeAmountLogService")
	private IPropFeeAmountLogService propFeeAmountLogService;

	@Resource(name = "propFeeCommService")
	private IPropFeeCommService propFeeCommService;

	@Override
	@Transactional(rollbackFor = { AppBizException.class, Exception.class,
			RuntimeException.class })
	public int addPropFeeDirectBill(PropFeeDirectBillDto propFeeDirectBill)
			throws AppBizException {

		Assert.notNull(propFeeDirectBill);
		/************************************************
		 * 判断输入参数的长度以及是否能为空
		 ************************************************/

		if (!StringUtils.isBlank(propFeeDirectBill.getReceiptNum())) {
			if (propFeeDirectBill.getReceiptNum().length() > 32) {
				throw new AppBizException(CodeConst.SYS_CODE_1002, "收据编码长度超出");
			}
		}

		if (!StringUtils.isBlank(propFeeDirectBill.getPayType())) {
			if (propFeeDirectBill.getPayType().length() > 8) {
				throw new AppBizException(CodeConst.SYS_CODE_1002, "支付方式长度超出");
			}
		}

		if (!StringUtils.isBlank(propFeeDirectBill.getStatus())) {
			if (propFeeDirectBill.getStatus().length() > 1) {
				throw new AppBizException(CodeConst.SYS_CODE_1002, "状态长度超出");
			}
		}

		if (!StringUtils.isBlank(propFeeDirectBill.getDeductReason())) {
			if (propFeeDirectBill.getDeductReason().length() > 256) {
				throw new AppBizException(CodeConst.SYS_CODE_1002, "扣款原因长度超出");
			}
		}

		if (!StringUtils.isBlank(propFeeDirectBill.getPayer())) {
			if (propFeeDirectBill.getPayer().length() > 32) {
				throw new AppBizException(CodeConst.SYS_CODE_1002, "付款人长度超出");
			}
		}

		if (!StringUtils.isBlank(propFeeDirectBill.getReceiver())) {
			if (propFeeDirectBill.getReceiver().length() > 32) {
				throw new AppBizException(CodeConst.SYS_CODE_1002, "收款人长度超出");
			}
		}

		if (propFeeDirectBill.getDeductMoney() == null) {
			propFeeDirectBill.setDeductMoney(new BigDecimal("0"));
		}

		if (StringUtils.isBlank(propFeeDirectBill.getDirectBillID())) {
			propFeeDirectBill.setDirectBillID(UUIDGenerator.nextCode());
		}
		propFeeDirectBill.setItemStat(TypeConst.FLAG_ON);
		propFeeDirectBill.setTscreate(new Date());
		propFeeDirectBill.setTsedit(new Date());
		return this.getSqlSession().insert(
				"PropFeeDirectBillMapper.insertSelective", propFeeDirectBill);
	}

	@Override
	@Transactional(rollbackFor = { AppBizException.class, Exception.class,
			RuntimeException.class })
	public int editPropFeeDirectBill(PropFeeDirectBillDto propFeeDirectBill)
			throws AppBizException {

		Assert.notNull(propFeeDirectBill);
		/************************************************
		 * 判断输入参数的长度以及是否能为空
		 ************************************************/
		if (StringUtils.isBlank(propFeeDirectBill.getDirectBillID())) {
			throw new AppBizException(CodeConst.SYS_CODE_1001, "ID不可为空");
		}
		PropFeeDirectBillDto oldPropFeeDirectBill = this
				.findPropFeeDirectBillByID(propFeeDirectBill.getDirectBillID());

		if (!StringUtils.isBlank(propFeeDirectBill.getReceiptNum())) {
			if (propFeeDirectBill.getReceiptNum().length() > 32) {
				throw new AppBizException(CodeConst.SYS_CODE_1002, "收据编码长度超出");
			}
		}

		if (!StringUtils.isBlank(propFeeDirectBill.getPayType())) {
			if (propFeeDirectBill.getPayType().length() > 8) {
				throw new AppBizException(CodeConst.SYS_CODE_1002, "支付方式长度超出");
			}
		}

		if (!StringUtils.isBlank(propFeeDirectBill.getStatus())) {
			if (propFeeDirectBill.getStatus().length() > 1) {
				throw new AppBizException(CodeConst.SYS_CODE_1002, "状态长度超出");
			}
		}

		if (!StringUtils.isBlank(propFeeDirectBill.getDeductReason())) {
			if (propFeeDirectBill.getDeductReason().length() > 256) {
				throw new AppBizException(CodeConst.SYS_CODE_1002, "扣款原因长度超出");
			}
		}

		if (!StringUtils.isBlank(propFeeDirectBill.getPayer())) {
			if (propFeeDirectBill.getPayer().length() > 32) {
				throw new AppBizException(CodeConst.SYS_CODE_1002, "付款人长度超出");
			}
		}

		if (!StringUtils.isBlank(propFeeDirectBill.getReceiver())) {
			if (propFeeDirectBill.getReceiver().length() > 32) {
				throw new AppBizException(CodeConst.SYS_CODE_1002, "收款人长度超出");
			}
		}

		if (oldPropFeeDirectBill == null) {
			throw new AppBizException(CodeConst.BIS_CODE_68001,
					InfoConst.BIS_INFO_68001);
		}
		propFeeDirectBill.setTsedit(new Date());
		return this.getSqlSession().update(
				"PropFeeDirectBillMapper.updateByPrimaryKeySelective",
				propFeeDirectBill);
	}

	@Override
	public PropFeeDirectBillDto findPropFeeDirectBillByID(
			String propFeeDirectBillID) throws AppBizException {
		if (StringUtils.isBlank(propFeeDirectBillID)) {

			throw new AppBizException(CodeConst.SYS_CODE_1001, "ID不可为空");
		}

		/************************************************
		 * 判断实体是否存在
		 ************************************************/
		PropFeeDirectBillDto oldPropFeeDirectBill = this.getSqlSession()
				.selectOne("PropFeeDirectBillSearchMapper.selectByPrimaryKey",
						propFeeDirectBillID);
		if (oldPropFeeDirectBill == null) {
			throw new AppBizException(CodeConst.BIS_CODE_68001,
					InfoConst.BIS_INFO_68001);
		}

		if (TypeConst.FLAG_OFF.equals(oldPropFeeDirectBill.getItemStat())) {

			throw new AppBizException(CodeConst.BIS_CODE_68001,
					InfoConst.BIS_INFO_68001);
		}
		return oldPropFeeDirectBill;
	}

	@Override
	@Transactional(rollbackFor = { AppBizException.class, Exception.class,
			RuntimeException.class })
	public int deletePropFeeDirectBillByLogic(String propFeeDirectBillID)
			throws AppBizException {

		if (StringUtils.isBlank(propFeeDirectBillID)) {
			throw new AppBizException(CodeConst.SYS_CODE_1001, "ID不可为空");
		}
		/************************************************
		 * 判断实体是否存在
		 ************************************************/
		PropFeeDirectBillDto oldPropFeeDirectBill = this
				.findPropFeeDirectBillByID(propFeeDirectBillID);

		oldPropFeeDirectBill.setItemStat(TypeConst.FLAG_OFF);
		oldPropFeeDirectBill.setTsedit(new Date());
		return this.getSqlSession().update(
				"PropFeeDirectBillMapper.updateByPrimaryKeySelective",
				oldPropFeeDirectBill);
	}

	@Override
	public List<Map<String, Object>> findPropFeeDirectBillByPage(String isBack,
			String commID, String apartmentType, String apartmentNum,
			String receiptNum, String invoiceNum, String startTime,
			String endTime, String payTypes, String feeTypes, String tsCreate,
			String billType, int pageNo, int pageSize) throws AppBizException {

		/************************************************
		 * 设置输入参数
		 ************************************************/
		Map<String, Object> map = new HashMap<String, Object>();
		if (!StringUtils.isBlank(startTime)) {
			map.put("startTime", Long.parseLong(startTime) / 1000);
		}
		if (!StringUtils.isBlank(endTime)) {
			map.put("endTime", Long.parseLong(endTime) / 1000);
		}
		if (!StringUtils.isBlank(payTypes)) {
			map.put("payTypes", payTypes.replaceAll("#", ","));
		}
		if (!StringUtils.isBlank(feeTypes)) {
			String feeTypeIDs[] = feeTypes.split("#");
			StringBuffer buffer = new StringBuffer();
			for (int i = 0; i < feeTypeIDs.length - 1; i++) {
				buffer.append("'").append(feeTypeIDs[i]).append("'")
						.append(",");

			}
			buffer.append("'").append(feeTypeIDs[feeTypeIDs.length - 1])
					.append("'");

			map.put("feeTypes", buffer.toString());
		}
		map.put("commID", commID);
		map.put("isBack", isBack);

		map.put("apartmentNum", apartmentNum);
		map.put("receiptNum", receiptNum);
		map.put("invoiceNum", invoiceNum);
		if (!StringUtils.isBlank(apartmentType)) {
			map.put("apartmentType", String.valueOf(apartmentType));
		}
		map.put("tsCreate", tsCreate);
		map.put("billType", billType);
		PageHelper.startPage(pageNo, pageSize);
		List<Map<String, Object>> list = this.getSqlSession().selectList(
				"PropFeeDirectBillSearchMapper.findAllPropFeeDirectBill", map);
		return list;
	}

	@Override
	public List<PropFeeDirectBillDto> getPropFeeDirectBillByPage(
			String tsCreate, String search, int pageNo, int pageSize)
			throws AppBizException {
		/************************************************
		 * 设置输入参数
		 ************************************************/
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("tsCreate", tsCreate);
		map.put("search", search);
		PageHelper.startPage(pageNo, pageSize);
		List<PropFeeDirectBillDto> list = this
				.getSqlSession()
				.selectList(
						"PropFeeDirectBillSearchMapper.getAllPropFeeDirectBillDto",
						map);
		return list;
	}

	@Override
	public List<Map<String, Object>> selectPropFeeDirectBillByRelevantID(
			String directBillID, String commID, String apartmentID,
			String payType, String status, String payerID, String receiverID)
			throws AppBizException {
		/************************************************
		 * 设置输入参数
		 ************************************************/
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("directBillID", directBillID);
		map.put("commID", commID);
		map.put("apartmentID", apartmentID);
		map.put("payType", payType);
		map.put("status", status);
		map.put("payerID", payerID);
		map.put("receiverID", receiverID);

		List<Map<String, Object>> list = this
				.getSqlSession()
				.selectList(
						"PropFeeDirectBillSearchMapper.selectPropFeeDirectBillDtoyRelevantID",
						map);
		return list;
	}

	@Override
	public List<PropFeeDirectBillDto> findPropFeeDirectBillByRelevantID(
			String directBillID, String commID, String apartmentID,
			String payType, String status, String payerID, String receiverID)
			throws AppBizException {
		/************************************************
		 * 设置输入参数
		 ************************************************/
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("directBillID", directBillID);
		map.put("commID", commID);
		map.put("apartmentID", apartmentID);
		map.put("payType", payType);
		map.put("status", status);
		map.put("payerID", payerID);
		map.put("receiverID", receiverID);

		List<PropFeeDirectBillDto> list = this
				.getSqlSession()
				.selectList(
						"PropFeeDirectBillSearchMapper.findPropFeeDirectBillDtoByRelevantID",
						map);
		return list;
	}

	@Override
	public List<PropFeeDirectBillDto> bauthfindPropFeeDirectBill(
			List<String> propFeeDirectBillIDs) throws AppBizException {
		/************************************************
		 * 设置输入参数
		 ************************************************/
		List<PropFeeDirectBillDto> list = this.getSqlSession().selectList(
				"PropFeeDirectBillSearchMapper.batchFindPropFeeDirectBill",
				propFeeDirectBillIDs);
		return list;
	}

	@Override
	public List<Map<String, Object>> bauthfindPropFeeDirectBillByMap(
			Map<String, Object> propFeeDirectBill) throws AppBizException {
		/************************************************
		 * 设置输入参数
		 ************************************************/
		List<Map<String, Object>> list = this
				.getSqlSession()
				.selectList(
						"PropFeeDirectBillSearchMapper.batchFindPropFeeDirectBillByMap",
						propFeeDirectBill);
		return list;
	}

	@Override
	public void clearCache() throws AppBizException {
		System.out.println("清除缓存成功");
	}

	@Override
	@Transactional(rollbackFor = { AppBizException.class, Exception.class,
			RuntimeException.class })
	public synchronized int addPropFeeDirectBills(
			PropFeeDirectBillDto propFeeDirectBill) throws AppBizException {
		if (StringUtils.isBlank(propFeeDirectBill.getApartmentID())) {
			throw new AppBizException(2, "亲，房屋信息");
		}
		if (StringUtils.isBlank(propFeeDirectBill.getCommID())) {
			throw new AppBizException(2, "亲，小区信息");
		}
		if (StringUtils.isBlank(propFeeDirectBill.getFeeTypeID())) {
			throw new AppBizException(2, "亲，类目名称信息");
		}
		if (propFeeDirectBill.getMoney() == null) {
			throw new AppBizException(2, "亲，应收总额");
		}
		if (StringUtils.isBlank(propFeeDirectBill.getPayType())) {
			throw new AppBizException(2, "亲，付款类型信息");
		}
		/*
		 * if (StringUtils.isBlank(propFeeDirectBill.getPayerID())) { throw new
		 * AppBizException(2, "亲，付款人信息"); }
		 */
		/*
		 * if (propFeeDirectBill.getPayType().equals("0") &&
		 * propFeeDirectBill.getPayType().equals("1") &&
		 * propFeeDirectBill.getPayType().equals("2") &&
		 * propFeeDirectBill.getPayType().equals("3")) { throw new
		 * AppBizException(2, "亲，付款类型信息"); }
		 */
		PropFeeTypeDto feeTypeDto = propFeeTypeService
				.findPropFeeTypeByID(propFeeDirectBill.getFeeTypeID());
		CerHouseholderDto cerHouseholderDto = new CerHouseholderDto();

		if (!StringUtils.isBlank(propFeeDirectBill.getPayerID())) {
			cerHouseholderDto = cerHouseholderService
					.findCerHouseholderByID(propFeeDirectBill.getPayerID());
		}

		/***
		 * 是否保证金
		 */
		List<PropFeeDetailDto> details = new ArrayList<PropFeeDetailDto>();

		/***
		 * 添加账单
		 */
		propFeeDirectBill.setPayer(cerHouseholderDto.getName());
		propFeeDirectBill.setDirectBillID(UUIDGenerator.nextCode());

		propFeeDirectBill.setBillTime(new Date());
		propFeeDirectBill.setStatus("1");
		propFeeDirectBill.setBillType("0");
		if (feeTypeDto.getIsBail().equals("1")) {

			propFeeDirectBill.setBillType("1");

		}
		this.addPropFeeDirectBill(propFeeDirectBill);

		details = addPropFeePaybillname(propFeeDirectBill);

		if (feeTypeDto.getIsBail().equals("0")) {
			// details = addPropFeePaybillname(propFeeDirectBill);
			/***
			 * 操作账户金额
			 */
			PropFeeAccountDto oldPropFeeAccount = propFeeAccountService
					.findAccountByApartID(propFeeDirectBill.getApartmentID());
			PropFeeAccountDto oldPropFeeAccountDto = operatmoney(
					propFeeDirectBill, "1", feeTypeDto, oldPropFeeAccount);
			if (details != null && details.size() > 0) {
				propFeeDirectBill.setPropFeeDetail(details.get(0));
			}
			operatmoney(propFeeDirectBill, "2", feeTypeDto,
					oldPropFeeAccountDto);

		}
		if (feeTypeDto.getIsBail().equals("1")) {

			// details = addPropFeePaybillname(propFeeDirectBill);
			/***
			 * 房屋鱼儿冻结金额
			 */

			operatmoney(propFeeDirectBill, "3", feeTypeDto, null);

		}
		/***
		 * 添加房屋缴费西厢
		 */
		if (details != null && details.size() > 0) {
			List<PropFeeDirectBillLinkDto> propFeeDirectBillLinkDtos = new ArrayList<PropFeeDirectBillLinkDto>();
			for (PropFeeDetailDto propFeeDetailDto : details) {
				PropFeeDirectBillLinkDto propFeeDirectBillLinkDto = new PropFeeDirectBillLinkDto();
				propFeeDirectBillLinkDto.setDetailID(IdUtil.getuuId());
				propFeeDirectBillLinkDto
						.setAmount(propFeeDetailDto.getAmount());
				propFeeDirectBillLinkDto.setDirectBillID(propFeeDirectBill
						.getDirectBillID());
				propFeeDirectBillLinkDto.setFeeTypeID(propFeeDetailDto
						.getFeeTypeID());
				propFeeDirectBillLinkDto.setFeeDetailID(propFeeDetailDto
						.getFeeDetailID());
				propFeeDirectBillLinkDto.setRealAmount(propFeeDetailDto
						.getRealamount());
				propFeeDirectBillLinkDto.setFeeDate(propFeeDetailDto
						.getFeeDate());
				propFeeDirectBillLinkDto.setDescription(propFeeDetailDto
						.getDescription());
				propFeeDirectBillLinkDto
						.setRemark(propFeeDetailDto.getRemark());
				propFeeDirectBillLinkDto.setCreateuserID(propFeeDirectBill
						.getCreateuserID());
				propFeeDirectBillLinkDto.setTscreate(new Date());
				propFeeDirectBillLinkDto.setTsedit(new Date());
				propFeeDirectBillLinkDto.setItemStat("1");
				propFeeDirectBillLinkDtos.add(propFeeDirectBillLinkDto);

			}
			if (propFeeDirectBillLinkDtos != null
					&& propFeeDirectBillLinkDtos.size() > 0) {
				this.getSqlSession().insert(
						"PropFeeDirectBillLinkBauthMapper.bauthInsert",
						propFeeDirectBillLinkDtos);
			}

			/***
			 * 变更其他费用金额为已经缴费
			 */

			int n = feeDetailService.setFeeDetailsPay(propFeeDirectBill
					.getApartmentID(), details.get(0).getFeeDetailIDs(),
					new Date());

			if (n > 0) {
				// if (feeTypeDto.getIsBail().equals("0")) {
				//
				// String addRemark = "用户 "
				// + (StringUtils
				// .isBlank(propFeeDirectBill.getPayer()) ? ""
				// : propFeeDirectBill.getPayer())
				// + "往房屋余额账户添加物业费预存物业费(其他费用)  "
				// + propFeeDirectBill.getMoney() + "元   操作人"
				// + propFeeDirectBill.getReceiver();
				// sendInfoToFinal(propFeeDirectBill, addRemark, "1",
				// feeTypeDto);
				// String subRemark = ("用户 "
				// + (StringUtils
				// .isBlank(propFeeDirectBill.getPayer()) ? ""
				// : propFeeDirectBill.getPayer())
				// + "的房屋余额账户扣除物业费预存物业费 (其他费用) "
				// + propFeeDirectBill.getMoney() + "元      操作人" +
				// propFeeDirectBill
				// .getReceiver());
				// sendInfoToFinal(propFeeDirectBill, subRemark, "0",
				// feeTypeDto);
				//
				// }
				// if (feeTypeDto.getIsBail().equals("1")) {
				//
				// String addRemark = "用户 "
				// + (StringUtils
				// .isBlank(propFeeDirectBill.getPayer()) ? ""
				// : propFeeDirectBill.getPayer()) + "提交保证金  "
				// + propFeeDirectBill.getMoney() + "元   操作人"
				// + propFeeDirectBill.getReceiver();
				// sendInfoToFinal(propFeeDirectBill, addRemark, "1",
				// feeTypeDto);
				// }
			}
			return n;

		}
		return 1;
	}

	/***
	 * 添加其他费用冲抵明细
	 * 
	 * @param propFeeDirectBill
	 * @param propFeeTypeDto
	 * @param propFeeDetailDto
	 * @return
	 * @throws AppBizException
	 */
	public PropFeeDirectOffsetInfoDto addDIrOffSetInfo(
			PropFeeDirectBillDto propFeeDirectBill,
			PropFeeTypeDto propFeeTypeDto, PropFeeDetailDto propFeeDetailDto)
			throws AppBizException {

		PropFeeDirectOffsetInfoDto directOffsetInfoDto = new PropFeeDirectOffsetInfoDto();
		directOffsetInfoDto.setAmount(propFeeDirectBill.getMoney());
		directOffsetInfoDto.setApartmentID(propFeeDirectBill.getApartmentID());
		directOffsetInfoDto.setCommID(propFeeDirectBill.getCommID());
		directOffsetInfoDto
				.setCreateuserID(propFeeDirectBill.getCreateuserID());
		directOffsetInfoDto.setFeeTypeID(propFeeTypeDto.getFeeTypeID());
		directOffsetInfoDto.setFeeDetailID(propFeeDetailDto.getFeeDetailID());
		directOffsetInfoDto.setOffsetMoney(propFeeDirectBill.getMoney());
		directOffsetInfoDto.setOffsetType("1");
		directOffsetInfoDto.setOffsetTime(new Date());
		directOffsetInfoDto.setOrderID(propFeeDirectBill.getDirectBillID());
		propFeeDirectOffsetInfoService
				.addPropFeeDirectOffsetInfo(directOffsetInfoDto);
		return directOffsetInfoDto;

	}

	public List<PropFeeDetailDto> addPropFeePaybillname(
			PropFeeDirectBillDto propFeePaybill) throws AppBizException {

		if (StringUtils.isBlank(propFeePaybill.getFeeTypeID())) {
			throw new AppBizException(2, "费用类目");
		}
		if (StringUtils.isBlank(propFeePaybill.getCommID())) {
			throw new AppBizException(2, "小区信息");
		}
		if (StringUtils.isBlank(propFeePaybill.getApartmentID())) {
			throw new AppBizException(2, "房屋信息");
		}
		if (StringUtils.isBlank(propFeePaybill.getPayType())) {
			throw new AppBizException(2, "支付信息");
		} else {

		}
		if (propFeePaybill.getMoney() == null) {
			throw new AppBizException(2, "缴费金额");
		}

		Map<String, Object> paMap = new HashMap<String, Object>();
		paMap.put("commID", propFeePaybill.getCommID());
		paMap.put("feeTypeID", propFeePaybill.getFeeTypeID());
		paMap.put("apartmentID", propFeePaybill.getApartmentID());
		paMap.put("belongType", "2");

		List<Map<String, Object>> ruleResult = this.getSqlSession().selectList(
				"PropFeeComputeRuleSearchMapper.getRuleByApartMentID", paMap);
		List<String> feeDetailIDs = new ArrayList<>();
		// 验证是否是自定义细项
		List<PropFeeDetailDto> details = new ArrayList<PropFeeDetailDto>();
		if (!"0".equals(propFeePaybill.getRuleID())) {

			PropFeeDetailDto propFeeDetail = new PropFeeDetailDto();

			propFeeDetail.setAmount(propFeePaybill.getMoney());

			propFeeDetail.setRuleID(propFeePaybill.getRuleID());

			propFeeDetail.setRealamount(propFeeDetail.getAmount());
			propFeeDetail.setFeeAmount(propFeeDetail.getAmount().toString());
			// propFeeDetail.setFeePrice(null);
			propFeeDetail.setApartmentID(propFeePaybill.getApartmentID());
			propFeeDetail.setFeeTypeID(propFeePaybill.getFeeTypeID());
			propFeeDetail.setType("1");
			propFeeDetail.setStatus("0");
			propFeeDetail.setFeeDate(DateUtil.getCurrentDate(new Date(),
					"yyyy-MM"));
			propFeeDetail.setFeeDetailID(IdUtil.getuuId());
			propFeeDetail.setItemStat(TypeConst.FLAG_ON);
			propFeeDetail.setTscreate(new Date());
			propFeeDetail.setTsedit(new Date());
			propFeeDetail.setPaytime(new Date());
			propFeeDetail.setIspre("1");
			feeDetailIDs.add(propFeeDetail.getFeeDetailID());
			details.add(propFeeDetail);

			if (details != null && details.size() > 0) {
				for (PropFeeDetailDto propFeeDetail1 : details) {
					propFeeDetail1.setFeeDetailIDs(feeDetailIDs);

				}
				this.getSqlSession().insert(
						"PropFeeDetailBauthMapper.bauthInsert", details);
				return details;
			}

		}

		if (ruleResult == null || ruleResult.size() <= 0) {
			throw new AppBizException(2, "亲，该房屋不能存在相关的缴费信息");
		}

		BigDecimal propfee = new BigDecimal(0);

		if (ruleResult != null && ruleResult.size() >= 0) {
			for (Map<String, Object> rule : ruleResult) {
				rule = PropertyUtils.turnToEntity1(rule);
				List<PropFeeDetailDto> detailsDetail = feeDetailService
						.findPropFeeDetailByRelevantID(null,
								propFeePaybill.getApartmentID(),
								propFeePaybill.getFeeTypeID(), null, null,
								null, "1", rule.get("ruleID").toString(), null);

				if ("2".equals(rule.get("validityType").toString())) {
					if (detailsDetail != null && detailsDetail.size() > 0) {

						for (PropFeeDetailDto propFeeDetailDto : detailsDetail) {
							if (!"1".equals(propFeeDetailDto.getStatus())) {
								propfee = propfee.add(propFeeDetailDto
										.getAmount());
								feeDetailIDs.add(propFeeDetailDto
										.getFeeDetailID());
							}
						}

					}
				}

				else {

					// if ("2".equals(rule.get("validityType").toString())) {
					// continue;
					// }
					String money = propFeeComputeRuleService.completeRule(rule
							.get("ruleID").toString(), propFeePaybill
							.getCommID(), propFeePaybill.getApartmentID());

					if (!StringUtils.isBlank(money)) {
						propFeePaybill.setRuleID(rule.get("ruleID").toString());
						BigDecimal amount = new BigDecimal(money);
						propfee = propfee.add(amount);

						/****
						 * 添加缴费细想
						 */
						PropFeeDetailDto propFeeDetail = new PropFeeDetailDto();

						propFeeDetail.setAmount(amount);

						propFeeDetail.setRuleID(rule.get("ruleID").toString());

						propFeeDetail.setRealamount(amount);
						propFeeDetail.setFeeAmount(null);
						// propFeeDetail.setFeePrice(null);
						propFeeDetail.setApartmentID(propFeePaybill
								.getApartmentID());
						propFeeDetail.setFeeTypeID(propFeePaybill
								.getFeeTypeID());
						propFeeDetail.setType("1");
						propFeeDetail.setStatus("0");
						propFeeDetail.setFeeDate(DateUtil.getCurrentDate(
								new Date(), "yyyy-MM"));
						propFeeDetail.setFeeDetailID(IdUtil.getuuId());
						propFeeDetail.setItemStat(TypeConst.FLAG_ON);
						propFeeDetail.setTscreate(new Date());
						propFeeDetail.setTsedit(new Date());
						propFeeDetail.setPaytime(new Date());
						propFeeDetail.setIspre("1");
						feeDetailIDs.add(propFeeDetail.getFeeDetailID());
						details.add(propFeeDetail);
					}
				}
			}
			/***
			 * 添加西厢
			 */
			if (propfee.compareTo(propFeePaybill.getMoney()) != 0) {
				throw new AppBizException(2, "亲，该房屋缴费金额已发生变化");
			}
			if (details != null && details.size() > 0) {
				for (PropFeeDetailDto propFeeDetail : details) {
					propFeeDetail.setFeeDetailIDs(feeDetailIDs);

				}
				this.getSqlSession().insert(
						"PropFeeDetailBauthMapper.bauthInsert", details);
				return details;
			}

		}
		return details;

	}

	public PropFeeAccountDto operatmoney(PropFeeDirectBillDto propFeePaybill,
			String type, PropFeeTypeDto feeTypeDto,
			PropFeeAccountDto oldPropFeeAccount) throws AppBizException {

		List<PropFeeAccountDto> propFeeAccountDtos = propFeeAccountService
				.findPropFeeAccountByRelevantID(null,
						propFeePaybill.getApartmentID(), "1",propFeePaybill.getAccountTypeCode());
		PropFeeAccountDto propFeeAccountDto = new PropFeeAccountDto();
		if (propFeeAccountDtos == null || propFeeAccountDtos.size() <= 0) {

			propFeeAccountDto.setApartmentID(propFeePaybill.getApartmentID());
			propFeeAccountDto.setMoney(new BigDecimal("0"));
			propFeeAccountDto.setStatus("1");
			propFeeAccountDto.setCreateuserUser(propFeePaybill
					.getCreateuserID());
			propFeeAccountDto.setAccountID(IdUtil.getuuId());
			propFeeAccountService.addPropFeeAccount(propFeeAccountDto);
		} else {
			propFeeAccountDto = propFeeAccountDtos.get(0);
		}
		propFeeAccountDto.setLinkOrderID(propFeePaybill.getDirectBillID());
		if (!type.equals("3")) {

			if (type.equals("1")) {

				propFeeAccountDto.setOperation("1");
				propFeeAccountDto.setRemark("用户 " + propFeePaybill.getPayer()
						+ "往房屋余额账户添加预存物业费(其他费用)  " + propFeePaybill.getMoney()
						+ "元   操作人" + propFeePaybill.getReceiver());
				propFeeAccountDto.setStatementType(propFeePaybill.getPayType());
				propFeeAccountDto.setItem("预存物业费");
			}
			if (type.equals("2")) {
				propFeeAccountDto.setOperation("2");
				if (feeTypeDto != null) {
					propFeeAccountDto.setItem(feeTypeDto.getFeeTypeName());
				}
				propFeeAccountDto.setRemark("用户 " + propFeePaybill.getPayer()
						+ "的房屋余额账户扣除物业费预存款 (其他费用) " + propFeePaybill.getMoney()
						+ "元      操作人" + propFeePaybill.getReceiver());
				propFeeAccountDto.setStatementType("7");
				PropFeeDirectOffsetInfoDto propFeeDirectOffsetInfo = addDIrOffSetInfo(
						propFeePaybill, feeTypeDto,
						propFeePaybill.getPropFeeDetail());
				propFeeAccountDto.setLinkOrderID(propFeeDirectOffsetInfo
						.getOffsetID());

			}

			if (!StringUtils.isBlank(propFeePaybill.getStatementType())) {
				propFeeAccountDto.setStatementType(propFeePaybill
						.getStatementType());
			}
			if (!StringUtils.isBlank(propFeePaybill.getStatementChannel())) {
				propFeeAccountDto.setStatementChannel(propFeePaybill
						.getStatementChannel());
			}
			propFeeAccountDto.setMoney(propFeePaybill.getMoney());
			propFeeAccountDto.setCreateuserUser(propFeePaybill.getPayer());

			// return
			// propFeeAccountService.editPropFeeAccount(propFeeAccountDto);

			return propFeeAccountService.addPropFeeLog(propFeeAccountDto,
					oldPropFeeAccount);

		}

		if (type.equals("3")) {
			PropFeeAccountFrozenDto feeAccountFrozenDto = new PropFeeAccountFrozenDto();
			feeAccountFrozenDto.setAccountID(propFeeAccountDto.getAccountID());
			feeAccountFrozenDto.setCreateuserID(propFeePaybill
					.getCreateuserID());
			feeAccountFrozenDto.setLinkID(propFeePaybill.getDirectBillID());
			feeAccountFrozenDto.setStatus("1");
			feeAccountFrozenDto.setMoney(propFeePaybill.getMoney());
			propFeeAccountFrozenService
					.addPropFeeAccountFrozen(feeAccountFrozenDto);
			return null;

		}
		return null;

	}

	@Override
	@Transactional(rollbackFor = { AppBizException.class, Exception.class,
			RuntimeException.class })
	public int returnBackBill(PropFeeDirectBillDto propFeeDirectBill)
			throws AppBizException {
		PropFeeDirectBillDto propFeeDirectBillDto = this
				.findPropFeeDirectBillByID(propFeeDirectBill.getDirectBillID());

		if (propFeeDirectBill.getDeductMoney() != null) {
			if (propFeeDirectBill.getDeductMoney().compareTo(
					propFeeDirectBillDto.getMoney()) > 0) {
				throw new AppBizException(2, "亲，扣款金额大于保证金金额");
			}
		}
		propFeeDirectBillDto.setEdituserID(propFeeDirectBill.getEdituserID());
		if (propFeeDirectBill.getDeductMoney() != null) {
			propFeeDirectBillDto.setDeductMoney(propFeeDirectBill
					.getDeductMoney());
		}
		propFeeDirectBillDto.setDeductReason(propFeeDirectBill
				.getDeductReason());

		propFeeDirectBillDto.setBackTime(new Date());
		propFeeDirectBillDto.setStatus("3");
		List<PropFeeAccountFrozenDto> propFeeAccountFrozenDtos = propFeeAccountFrozenService
				.findPropFeeAccountFrozenByRelevantID(null,
						propFeeDirectBill.getDirectBillID(), null, "1");
		PropFeeAmountLogDto accountlog = new PropFeeAmountLogDto();
		if (propFeeAccountFrozenDtos != null
				&& propFeeAccountFrozenDtos.size() > 0) {
			propFeeAccountFrozenDtos.get(0).setStatus("2");
			propFeeAccountFrozenDtos.get(0).setEdituserID(
					propFeeDirectBill.getEdituserID());

			accountlog.setAccountID(propFeeAccountFrozenDtos.get(0)
					.getAccountID());
			accountlog.setCreateuser(propFeeDirectBill.getEdituserID());

			accountlog.setLogType(10);
			accountlog.setOperation("2");
			// accountlog.setLogContent(JSONObject.fromObject(
			// propFeeAccountFrozenDtos.get(0)).toString());
			accountlog.setLinkID(propFeeAccountFrozenDtos.get(0).getFrozenID());
			accountlog
					.setTotalMoney(propFeeAccountFrozenDtos.get(0).getMoney());
			accountlog.setMoney(propFeeDirectBillDto.getDeductMoney());
			accountlog.setCreateuser(propFeeDirectBill.getReceiver());
			accountlog.setCreateuserID(propFeeDirectBill.getCreateuserID());

			if (propFeeDirectBill.getDeductMoney() == null) {
				accountlog.setRemark("退还业主" + propFeeDirectBillDto.getPayer()
						+ "保证金 " + propFeeAccountFrozenDtos.get(0).getMoney()
						+ "元   操作人  :" + propFeeDirectBill.getReceiver());
			} else if (propFeeDirectBill.getDeductMoney().compareTo(
					new BigDecimal("0")) > 0) {
				accountlog.setRemark("退还业主"
						+ propFeeDirectBillDto.getPayer()
						+ "保证金   "
						+ propFeeAccountFrozenDtos.get(0).getMoney()
								.subtract(propFeeDirectBill.getDeductMoney())
						+ "元     操作人  :" + propFeeDirectBill.getReceiver());
			}

			propFeeAmountLogService.addPropFeeAmountLog(accountlog);
			propFeeAccountFrozenService
					.editPropFeeAccountFrozen(propFeeAccountFrozenDtos.get(0));

		}

		int n = this.editPropFeeDirectBill(propFeeDirectBillDto);

		if (n > 0) {

			sendInfoToFinal(propFeeDirectBillDto, accountlog.getRemark(), "0",
					null);
		}
		return n;

	}

	@Override
	@Transactional(rollbackFor = { AppBizException.class, Exception.class,
			RuntimeException.class })
	public int turnAccountBill(PropFeeDirectBillDto propFeeDirectBill)
			throws AppBizException {

		PropFeeDirectBillDto propFeeDirectBillDto = this
				.findPropFeeDirectBillByID(propFeeDirectBill.getDirectBillID());
		PropFeeTypeDto feeTypeDto = new PropFeeTypeDto();

		propFeeDirectBill.setApartmentID(propFeeDirectBillDto.getApartmentID());
		propFeeDirectBill.setCommID(propFeeDirectBillDto.getCommID());

		PropFeeAccountDto propFeeAccountDto = propFeeAccountService
				.findAccountByApartID(propFeeDirectBillDto.getApartmentID());

		if (propFeeDirectBill.getDeductMoney() != null) {
			if (propFeeDirectBill.getDeductMoney().compareTo(
					propFeeDirectBillDto.getMoney()) > 0) {
				throw new AppBizException(2, "亲，扣款金额大于保证金金额");
			}
		}

		propFeeDirectBillDto.setEdituserID(propFeeDirectBill.getEdituserID());

		if (propFeeDirectBill.getDeductMoney() != null) {
			propFeeDirectBillDto.setDeductMoney(propFeeDirectBill
					.getDeductMoney());
		}
		propFeeDirectBillDto.setDeductReason(propFeeDirectBill
				.getDeductReason());

		List<PropFeeAccountFrozenDto> propFeeAccountFrozenDtos = propFeeAccountFrozenService
				.findPropFeeAccountFrozenByRelevantID(null,
						propFeeDirectBill.getDirectBillID(),
						propFeeAccountDto.getAccountID(), "1");
		PropFeeAmountLogDto accountlog = new PropFeeAmountLogDto();
		if (propFeeAccountFrozenDtos != null
				&& propFeeAccountFrozenDtos.size() > 0) {
			propFeeAccountFrozenDtos.get(0).setStatus("2");
			propFeeAccountFrozenDtos.get(0).setEdituserID(
					propFeeDirectBill.getEdituserID());
			accountlog.setLinkID(propFeeDirectBillDto.getDirectBillID());

			accountlog.setAccountID(propFeeAccountFrozenDtos.get(0)
					.getAccountID());
			accountlog.setCreateuser(propFeeDirectBill.getEdituserID());

			accountlog.setLogType(10);
			accountlog.setOperation("2");
			accountlog.setLinkID(propFeeAccountFrozenDtos.get(0).getFrozenID());
			accountlog
					.setTotalMoney(propFeeAccountFrozenDtos.get(0).getMoney());
			accountlog.setMoney(propFeeDirectBillDto.getDeductMoney());
			accountlog.setCreateuser(propFeeDirectBill.getReceiver());
			accountlog.setCreateuserID(propFeeDirectBill.getCreateuserID());
			if (propFeeDirectBill.getDeductMoney() == null) {
				accountlog.setRemark(" 业主" + propFeeDirectBillDto.getPayer()
						+ "将保证金 " + propFeeAccountFrozenDtos.get(0).getMoney()
						+ "元转存房屋账户(解冻)   操作人  :"
						+ propFeeDirectBill.getReceiver());
			} else if (propFeeDirectBill.getDeductMoney().compareTo(
					new BigDecimal("0")) > 0) {
				accountlog.setRemark("业主"
						+ propFeeDirectBillDto.getPayer()
						+ "将保证金   "
						+ propFeeAccountFrozenDtos.get(0).getMoney()
								.subtract(propFeeDirectBill.getDeductMoney())
						+ "元 存房屋账户(解冻)        操作人  :"
						+ propFeeDirectBill.getReceiver());
			}
			if (!StringUtils.isBlank(propFeeDirectBillDto.getFeeTypeID())) {
				feeTypeDto = propFeeTypeService
						.findPropFeeTypeByID(propFeeDirectBillDto
								.getFeeTypeID());
			} else {
				List<PropFeeDirectBillLinkDto> propFeeDirectBillLinks = propFeeDirectBillLinkService
						.findPropFeeDirectBillLinkByRelevantID(null,
								propFeeDirectBillDto.getDirectBillID(), null,
								null);
				if (propFeeDirectBillLinks != null
						&& propFeeDirectBillLinks.size() > 0) {
					feeTypeDto = propFeeTypeService
							.findPropFeeTypeByID(propFeeDirectBillLinks.get(0)
									.getFeeTypeID());
				}
			}

			accountlog.setItem(feeTypeDto.getFeeTypeName());
			propFeeAccountDto.setItem(feeTypeDto.getFeeTypeName());
			accountlog.setStatementType("6");
			if (!StringUtils.isBlank(propFeeDirectBill.getStatementChannel())) {
				accountlog.setStatementChannel(propFeeDirectBill
						.getStatementChannel());
			}
			propFeeAmountLogService.addPropFeeAmountLog(accountlog);
			propFeeAccountFrozenService
					.editPropFeeAccountFrozen(propFeeAccountFrozenDtos.get(0));
			propFeeAccountDto.setLinkOrderID(propFeeDirectBill
					.getDirectBillID());
			propFeeAccountDto.setOperation("1");
			propFeeAccountDto
					.setMoney(propFeeAccountFrozenDtos.get(0).getMoney()
							.subtract(propFeeDirectBillDto.getDeductMoney()));
			propFeeAccountDto.setRemark("用户 " + propFeeDirectBillDto.getPayer()
					+ "往房屋余额账户转存保证金  " + propFeeAccountDto.getMoney() + " 操作人"
					+ propFeeDirectBill.getReceiver());
			propFeeAccountDto.setStatementType("6");
			propFeeAccountDto
					.setCreateuserUser(propFeeDirectBillDto.getPayer());
			propFeeAccountService.editPropFeeAccount(propFeeAccountDto);

		}
		propFeeDirectBillDto.setBackTime(new Date());
		propFeeDirectBillDto.setStatus("2");
		addPropFeeTransfer(propFeeDirectBillDto, propFeeAccountDto);
		int n = this.editPropFeeDirectBill(propFeeDirectBillDto);
		if (n > 0) {
			propFeeDirectBillDto.setPayType("6");
			sendInfoToFinal(propFeeDirectBillDto, accountlog.getRemark(), "1",
					feeTypeDto);
		}

		return n;

	}

	public int addPropFeeTransfer(PropFeeDirectBillDto propFeeDirectBillDto,
			PropFeeAccountDto propFeeAccountDto) throws AppBizException {
		PropFeeTransferDto propFeeTransferDto = new PropFeeTransferDto();
		propFeeTransferDto
				.setApartmentID(propFeeDirectBillDto.getApartmentID());
		propFeeTransferDto.setCommID(propFeeDirectBillDto.getCommID());
		propFeeTransferDto
				.setCreateuserID(propFeeDirectBillDto.getEdituserID());
		propFeeTransferDto.setTransferTime(new Date());
		propFeeTransferDto.setDirectBillID(propFeeDirectBillDto
				.getDirectBillID());
		propFeeTransferDto.setMoney(propFeeAccountDto.getMoney());

		return propFeeTransferService.addPropFeeTransfer(propFeeTransferDto);

	}

	/***
	 * 发送消息去财务中心
	 * 
	 * @param propFeePreBill
	 * @param propFeeAccountDto
	 * @param cerHouseholderDto
	 * @throws AppBizException
	 */
	public int sendInfoToFinal(PropFeeDirectBillDto propFeePreBill,
			String remark, String ruleType, PropFeeTypeDto feeTypeDto)
			throws AppBizException {

		try {

			if (propFeePreBill != null) {
				return 1;
			}

			PayBillInfo payBillInfo = new PayBillInfo();
			payBillInfo.setApartmentID(propFeePreBill.getApartmentID());
			payBillInfo.setMoney(propFeePreBill.getMoney().toString());
			payBillInfo.setCommID(propFeePreBill.getCommID());
			payBillInfo.setTsCharge(String.valueOf(propFeePreBill.getBillTime()
					.getTime()));
			payBillInfo.setTsBill((String.valueOf(propFeePreBill.getBillTime()
					.getTime())));
			payBillInfo.setBillID(propFeePreBill.getDirectBillID());
			payBillInfo.setChargeType(propFeePreBill.getPayType());
			payBillInfo.setChargeID(propFeePreBill.getDirectBillID());
			payBillInfo.setChargeUserID(propFeePreBill.getCreateuserID());
			payBillInfo.setChargeUserName(propFeePreBill.getReceiver());
			payBillInfo.setRuleType(ruleType);
			payBillInfo.setPayUserID(propFeePreBill.getPayerID());
			payBillInfo.setPayUserName(propFeePreBill.getPayer());

			payBillInfo.setRemark(remark);

			if (feeTypeDto != null) {
				payBillInfo.setFeeTypeDto(feeTypeDto);
			} else {
				List<PropFeeDirectBillLinkDto> propFeeDirectBillLinkDtos = propFeeDirectBillLinkService
						.findPropFeeDirectBillLinkByRelevantID(null,
								propFeePreBill.getDirectBillID(), null, null);

				if (propFeeDirectBillLinkDtos != null
						&& propFeeDirectBillLinkDtos.size() > 0) {
					PropFeeTypeDto propFeeTypeDto = propFeeTypeService
							.findPropFeeTypeByID(propFeeDirectBillLinkDtos.get(
									0).getFeeTypeID());
					payBillInfo.setFeeTypeDto(propFeeTypeDto);
				}
			}

			/***
			 * "opypte":""//操作类型 add：新增 update：修改 delete：删除
			 */
			payBillInfo.setOpypte("add");
			final String accessToken = propFeePreBill.getAccessToken();
			PayBillInfo payBill = propFeeCommService
					.getPayBillInfo(payBillInfo);
			if (payBill != null) {
				final Map<String, Object> par = new HashMap<String, Object>();
				List<PayBillInfo> payBillInfos = new ArrayList<PayBillInfo>();
				payBillInfos.add(payBill);
				par.put("sourceList", payBillInfos);
				try {
					Thread thread = new Thread(new Runnable() {

						@Override
						public void run() {
							HttpSvcUtils
									.doPostInfoSvc(UrlPath.sendInfoToFinance,
											par, accessToken);
						}
					});
					thread.start();

				} catch (Exception e) {
					logger.error(e.getMessage());
				}
			}
		} catch (Exception e) {
			logger.error(e.getMessage());
		}
		return 1;

	}

	@Override
	public int sendInfoToEditFinal(PropFeeDirectBillDto propFeePreBill)
			throws AppBizException {

		try {
			if (propFeePreBill != null) {
				return 1;
			}

			PayBillInfo payBillInfo = new PayBillInfo();
			payBillInfo.setApartmentID(propFeePreBill.getApartmentID());
			payBillInfo.setMoney(propFeePreBill.getMoney().toString());
			payBillInfo.setCommID(propFeePreBill.getCommID());
			payBillInfo.setTsCharge(String.valueOf(propFeePreBill.getBillTime()
					.getTime()));
			payBillInfo.setTsBill((String.valueOf(propFeePreBill.getBillTime()
					.getTime())));
			payBillInfo.setBillID(propFeePreBill.getDirectBillID());
			payBillInfo.setChargeType(propFeePreBill.getPayType());
			payBillInfo.setChargeID(propFeePreBill.getDirectBillID());
			payBillInfo.setChargeUserID(propFeePreBill.getCreateuserID());
			payBillInfo.setChargeUserName(propFeePreBill.getReceiver());
			PropFeeTypeDto feeTypeDto = propFeeTypeService
					.findPropFeeTypeByID(propFeePreBill.getFeeTypeID());
			if (feeTypeDto.getIsBail().equals("1")) {
				payBillInfo.setRuleType("1");
			} else {
				payBillInfo.setRuleType("0");
			}

			payBillInfo.setPayUserID(propFeePreBill.getPayerID());
			payBillInfo.setPayUserName(propFeePreBill.getPayer());

			payBillInfo.setFeeTypeDto(feeTypeDto);

			/***
			 * "opypte":""//操作类型 add：新增 update：修改 delete：删除
			 */
			payBillInfo.setOpypte("update");
			final String accessToken = propFeePreBill.getAccessToken();
			PayBillInfo payBill = propFeeCommService
					.getPayBillInfo(payBillInfo);
			if (payBill != null) {
				final Map<String, Object> par = new HashMap<String, Object>();
				List<PayBillInfo> payBillInfos = new ArrayList<PayBillInfo>();
				payBillInfos.add(payBill);
				par.put("sourceList", payBillInfos);
				try {
					Thread thread = new Thread(new Runnable() {

						@Override
						public void run() {
							HttpSvcUtils
									.doPostInfoSvc(UrlPath.sendInfoToFinance,
											par, accessToken);
						}
					});
					thread.start();

				} catch (Exception e) {
					logger.error(e.getMessage());
				}
			}
		} catch (Exception e) {
			logger.error(e.getMessage());
		}
		return 1;

	}

	@Override
	public Map<String, Object> getTotalAmount(String commID,
			String apartmentType, String apartmentNum, String receiptNum,
			String invoiceNum, String startTime, String endTime,
			String payTypes, String feeTypes, String tsCreate, String billType) {

		/************************************************
		 * 设置输入参数
		 ************************************************/
		Map<String, Object> map = new HashMap<String, Object>();
		if (!StringUtils.isBlank(startTime)) {
			map.put("startTime", Long.parseLong(startTime) / 1000);
		}
		if (!StringUtils.isBlank(endTime)) {
			map.put("endTime", Long.parseLong(endTime) / 1000);
		}
		if (!StringUtils.isBlank(payTypes)) {
			map.put("payTypes", payTypes.replaceAll("#", ","));
		}
		if (!StringUtils.isBlank(feeTypes)) {
			String feeTypeIDs[] = feeTypes.split("#");
			StringBuffer buffer = new StringBuffer();
			for (int i = 0; i < feeTypeIDs.length - 1; i++) {
				buffer.append("'").append(feeTypeIDs[i]).append("'")
						.append(",");

			}
			buffer.append("'").append(feeTypeIDs[feeTypeIDs.length - 1])
					.append("'");

			map.put("feeTypes", buffer.toString());
		}
		map.put("commID", commID);

		map.put("apartmentNum", apartmentNum);
		map.put("receiptNum", receiptNum);
		map.put("invoiceNum", invoiceNum);
		if (!StringUtils.isBlank(apartmentType)) {
			map.put("apartmentType", String.valueOf(apartmentType));
		}
		map.put("tsCreate", tsCreate);
		map.put("billType", billType);

		Map<String, Object> list = this.getSqlSession().selectOne(
				"PropFeeDirectBillSearchMapper.findTotalAmount", map);
		return list;
	}

	@Override
	public List<Map<String, Object>> synchDirBillData(Map<String, Object> map)
			throws AppBizException {

		/************************************************
		 * 设置输入参数
		 ************************************************/
		if (map.containsKey("tsedit")) {
			if (map.get("tsedit") != null) {
				if (!StringUtils.isInt(map.get("tsedit").toString())) {
					throw new AppBizException(2, "参数类型错误");
				}
				map.put("tsedit",
						Long.parseLong(map.get("tsedit").toString()) / 1000);
			}
		}
		List<Map<String, Object>> list = this.getSqlSession().selectList(
				"PropFeeDirectBillSearchMapper.synchDirBillData", map);
		return list;
	}

	@Override
	public List<Map<String, Object>> canclePropFeeDirectBill(
			Map<String, Object> parMap, int pageNo, int pageSize)
			throws AppBizException {
		PageHelper.startPage(pageNo, pageSize);
		List<Map<String, Object>> list = this
				.getSqlSession()
				.selectList(
						"PropFeeDirectBillSearchMapper.canclePropFeeDirectBill",
						parMap);
		return list;
	}

	@Override
	@Transactional(rollbackFor = { AppBizException.class, Exception.class,
			RuntimeException.class })
	public int revokePropFeeDirect(PropFeeDirectBillDto propFeeDirectBill)
			throws AppBizException {
		PropFeeDirectBillDto oldPropFeeDirectBill = this
				.findPropFeeDirectBillByID(propFeeDirectBill.getDirectBillID());
		if ("2".equals(oldPropFeeDirectBill.getStatus())) {
			throw new AppBizException(98, "已撤销");

		}
		oldPropFeeDirectBill.setCanleMan(propFeeDirectBill.getCanleMan());
		oldPropFeeDirectBill.setCanleTime(propFeeDirectBill.getCanleTime());
		oldPropFeeDirectBill.setCanleManID(propFeeDirectBill.getCanleManID());
		oldPropFeeDirectBill.setEdituserID(propFeeDirectBill.getCanleManID());
		oldPropFeeDirectBill.setState("2");
		PropFeeAccountDto p = propFeeAccountService
				.getAccountByApartID(oldPropFeeDirectBill.getApartmentID());
		if (p == null) {
			throw new AppBizException(98, "账户不存在");
		}

		Map<String, Object> parMap = new HashMap<String, Object>();
		parMap.put("linkID", oldPropFeeDirectBill.getDirectBillID());
		parMap.put("directBillID", oldPropFeeDirectBill.getDirectBillID());
		parMap.put("accountID", p.getAccountID());

		/***
		 * 跟新冲抵
		 */

		this.getSqlSession().update(
				"PropFeeDirectOffsetInfoBauthMapper.updatePropFeeAccountLog",
				parMap);
		this.getSqlSession()
				.update("PropFeeDirectOffsetInfoBauthMapper.updatePropFeeDirectOffsetInfo",
						parMap);
		/***
		 * 删除费用信息
		 */
		this.getSqlSession().update(
				"PropFeeDirectBillLinkBauthMapper.deletePropFeeDetail", parMap);
		/**
		 * 删除关联信息
		 */
		this.getSqlSession().update(
				"PropFeeDirectBillLinkBauthMapper.deletePropFeeDirectBillLink",
				parMap);
		/**
		 * 伤处房屋冻结信息
		 */
		this.getSqlSession().update(
				"PropFeeAccountFrozenBauthMapper.deletePropFeeAccountFrozen",
				parMap);
		PropFeeTypeDto feeTypeDto = new PropFeeTypeDto();
		if (!StringUtils.isBlank(oldPropFeeDirectBill.getFeeTypeID())) {
			feeTypeDto = propFeeTypeService
					.findPropFeeTypeByID(oldPropFeeDirectBill.getFeeTypeID());
		} else {
			List<PropFeeDirectBillLinkDto> propFeeDirectBillLinks = propFeeDirectBillLinkService
					.findPropFeeDirectBillLinkByRelevantID(null,
							oldPropFeeDirectBill.getDirectBillID(), null, null);
			if (propFeeDirectBillLinks != null
					&& propFeeDirectBillLinks.size() > 0) {
				feeTypeDto = propFeeTypeService
						.findPropFeeTypeByID(propFeeDirectBillLinks.get(0)
								.getFeeTypeID());
			}
		}

		if (feeTypeDto.getIsBail().equals("0")) {
			addPropFeeAmountLog(oldPropFeeDirectBill, p);
		}
		return this.editPropFeeDirectBill(oldPropFeeDirectBill);

	}

	public int addPropFeeAmountLog(PropFeeDirectBillDto oldPropFeeDirectBill,
			PropFeeAccountDto p) throws AppBizException {
		PropFeeTypeDto propFeeTypeDto = propFeeTypeService
				.findPropFeeTypeByID(oldPropFeeDirectBill.getFeeTypeID());
		PropFeeAmountLogDto propFeeAmountLogDto = new PropFeeAmountLogDto();
		PropFeeAmountLogDto propFeeAmountlog = new PropFeeAmountLogDto();
		propFeeAmountlog.setAccountID(p.getAccountID());
		propFeeAmountlog.setCreateuser(oldPropFeeDirectBill.getCanleMan());
		propFeeAmountlog.setCreateuserID(oldPropFeeDirectBill.getCanleManID());
		propFeeAmountlog.setLogID(IdUtil.getuuId());
		propFeeAmountlog.setOperation("1");
		propFeeAmountlog.setStatementType("16");
		propFeeAmountlog.setRemark("其他费用冲抵撤销");
		propFeeAmountlog.setItem(propFeeTypeDto.getFeeTypeName());
		propFeeAmountlog.setTscreate(new Date());
		propFeeAmountlog.setTimes(String.valueOf(propFeeAmountlog.getTscreate()
				.getTime()));
		propFeeAmountlog.setTimes(String.valueOf(propFeeAmountlog.getTscreate()
				.getTime()));
		propFeeAmountlog.setLinkID(oldPropFeeDirectBill.getDirectBillID());
		propFeeAmountlog.setLogType(13);
		propFeeAmountlog.setItemStat("1");
		propFeeAmountlog.setTotalMoney(p.getMoney());
		propFeeAmountlog.setMoney(oldPropFeeDirectBill.getMoney());
		List<PropFeeAmountLogDto> propFeeAmountLogDtos = new ArrayList<PropFeeAmountLogDto>();

		propFeeAmountLogDto.setAccountID(p.getAccountID());
		propFeeAmountLogDto.setCreateuser(oldPropFeeDirectBill.getCanleMan());
		propFeeAmountLogDto.setCreateuserID(oldPropFeeDirectBill
				.getCanleManID());
		propFeeAmountLogDto.setLogID(IdUtil.getuuId());
		propFeeAmountLogDto.setOperation("2");
		propFeeAmountLogDto.setStatementType("17");
		propFeeAmountLogDto.setRemark("其他费用撤销");
		propFeeAmountLogDto.setItem(propFeeTypeDto.getFeeTypeName());
		propFeeAmountLogDto.setTscreate(new Date());
		propFeeAmountLogDto.setTimes(String.valueOf(propFeeAmountLogDto
				.getTscreate().getTime() + 1000l));

		propFeeAmountLogDto.setItemStat("1");
		propFeeAmountLogDto.setLinkID(oldPropFeeDirectBill.getDirectBillID());
		propFeeAmountLogDto.setLogType(14);
		propFeeAmountLogDto.setTotalMoney(p.getMoney().add(
				oldPropFeeDirectBill.getMoney()));
		propFeeAmountLogDto.setMoney(oldPropFeeDirectBill.getMoney());
		propFeeAmountLogDtos.add(propFeeAmountLogDto);
		propFeeAmountLogDtos.add(propFeeAmountlog);
		return propFeeAmountLogService
				.addPropFeeAmountLog(propFeeAmountLogDtos);

	}

}
